// 参战单位工具

/**
 * 校验参战单位经脉是否有某项
 * @param {*} fight_unit 
 * @param {*} sects_name 
 * @param {*} name 
 * @returns 
 */
export function check_fight_unit_jingmai(fight_unit, sects_name, name) {
    if (fight_unit["类型"] === "bb") {
        return false;
    }
    return fight_unit["门派"] === sects_name && fight_unit["奇经八脉"] && fight_unit["奇经八脉"][name] && fight_unit["奇经八脉"][name] === 1;
}

/**
 * 取符石组合效果
 * @param {*} fight_unit 
 * @param {*} skill_name 
 * @returns 
 */
export function check_fight_unit_fushi_skill(fight_unit, skill_name) {
    if (fight_unit["符石技能效果"] && fight_unit["符石技能效果"][skill_name]) {
        return fight_unit["符石技能效果"][skill_name];
    } else {
        return false;
    }
}

/**
 * 获取参战单位的技能等级 战斗处理类:取技能等级
 * @param {*} fight_unit 
 * @param {*} skill_name 
 */
export function get_unit_skill_level(fight_unit, skill_name) {

    if (fight_unit["队伍"] === 0) {
        return fight_unit["等级"] + 10;

    }
    for (let index = 0; index < fight_unit["主动技能"].length; index++) {
        let skill = fight_unit["主动技能"][index];
        if (skill["名称"] === skill_name) {
            return skill["等级"];
        }
    }

    for (let index = 0; index < fight_unit["附加状态"].length; index++) {
        let element = fight_unit["附加状态"][index];
        if (element["名称"] === skill_name) {
            return element["等级"];
        }
    }

    for (let index = 0; index < fight_unit["追加法术"].length; index++) {
        let element = fight_unit["追加法术"][index];
        if (element["名称"] === skill_name) {
            return element["等级"];
        }
    }

    if (fight_unit["披坚执锐"]) {
        for (let index = 0; index < fight_unit["披坚执锐"].length; index++) {
            let element = fight_unit["披坚执锐"][index];
            if (element["名称"] === skill_name) {
                return element["等级"];
            }
        }
    }

    // 取师门主动技能等级
    if (fight_unit["类型"] === "角色" && fight_unit["门派"] !== "无门派") {
        for (let index = 0; index < fight_unit["师门技能"].length; index++) {
            let element = fight_unit["师门技能"][index];
            if (element["名称"] === skill_name) {
                return element["等级"];
            }
        }
    }
    return fight_unit["等级"];
}

/**
 * 获取参战单位的技能信息
 */
export function get_unit_skill_data(fight_unit, skill_type, skill_name) {
    for (let index = 0; index < fight_unit[skill_type].length; index++) {
        let skill = fight_unit[skill_type][index];
        if (skill["名称"] === skill_name) {
            return skill;
        }
    }
    return undefined;
}


/**
 * 加载变身属性
 * @param {*} fight_unit 
 */
function load_characters_unit_bianshen(fight_unit) {
    if (fight_unit["变身数据"] && G.ItemUtils.bs_data[fight_unit["变身数据"]]) {
        let bs_data = G.ItemUtils.bs_data[fight_unit["变身数据"]];
        let skill_name = bs_data["技能"];
        let skill_data = G.SkillData.default[skill_name];
        // 从技能读取变身算法
        if (skill_data && skill_data["变身"]) {
            skill_data["变身"](fight_unit);
        }
    }
}



/**
 * 加载符石技能效果
 * @param {*} fight_unit 
 */
function load_characters_unit_fushi_skill(fight_data, fight_unit) {
    if (check_fight_unit_fushi_skill(fight_unit, "无心插柳")) {
        fight_unit["溅射"] = check_fight_unit_fushi_skill(fight_unit, "无心插柳") / 100;
        if (fight_unit["溅射"] >= 0.5) {
            fight_unit["溅射"] = 0.5;
        }
    }
    if (check_fight_unit_fushi_skill(fight_unit, "心随我动")) {
        fight_unit["心随我动"] = check_fight_unit_fushi_skill(fight_unit, "心随我动");
    }
    if (check_fight_unit_fushi_skill(fight_unit, "云随风舞")) {
        fight_unit["云随风舞"] = check_fight_unit_fushi_skill(fight_unit, "云随风舞");
    }
    if (check_fight_unit_fushi_skill(fight_unit, "高山流水") && fight_data["PK战斗"]) {
        fight_unit["高山流水"] = check_fight_unit_fushi_skill(fight_unit, "高山流水");
    }
    if (check_fight_unit_fushi_skill(fight_unit, "百无禁忌") && fight_data["PK战斗"]) {
        fight_unit["百无禁忌"] = check_fight_unit_fushi_skill(fight_unit, "百无禁忌");
    }
    if (check_fight_unit_fushi_skill(fight_unit, "百步穿杨")) {
        fight_unit["百步穿杨"] = check_fight_unit_fushi_skill(fight_unit, "百步穿杨");
    }
    if (check_fight_unit_fushi_skill(fight_unit, "隔山打牛")) {
        fight_unit["隔山打牛"] = check_fight_unit_fushi_skill(fight_unit, "隔山打牛");
    }
    if (check_fight_unit_fushi_skill(fight_unit, "飞檐走壁") && fight_data["PK战斗"]) {
        fight_unit["飞檐走壁"] = 1 - check_fight_unit_fushi_skill(fight_unit, "飞檐走壁") * 0.01;
    }
    if (check_fight_unit_fushi_skill(fight_unit, "天降大任")) {
        fight_unit["天降大任"] = 1 - check_fight_unit_fushi_skill(fight_unit, "天降大任") * 0.01;
    }
    if (check_fight_unit_fushi_skill(fight_unit, "点石成金")) {
        fight_unit["点石成金"] = 1 - check_fight_unit_fushi_skill(fight_unit, "点石成金") * 0.01;
    }
    if (check_fight_unit_fushi_skill(fight_unit, "暗渡陈仓")) {
        fight_unit["暗渡陈仓"] = 1 - check_fight_unit_fushi_skill(fight_unit, "暗渡陈仓") * 0.01;
    }
    if (check_fight_unit_fushi_skill(fight_unit, "化敌为友")) {
        fight_unit["化敌为友"] = 1 - check_fight_unit_fushi_skill(fight_unit, "化敌为友") * 0.01;
    }
    if (check_fight_unit_fushi_skill(fight_unit, "降妖伏魔")) {
        fight_unit["降妖伏魔"] = 1 + check_fight_unit_fushi_skill(fight_unit, "降妖伏魔") * 0.01;
    }
    if (G.FightUnitUtils.check_fight_unit_fushi_skill(fight_unit, "福泽天下") && !fight_data["PK战斗"]) {  //法系
        fight_unit["福泽天下"] = G.FightUnitUtils.check_fight_unit_fushi_skill(fight_unit, "福泽天下");
    }
    if (G.FightUnitUtils.check_fight_unit_fushi_skill(fight_unit, "凤舞九天") && !fight_data["PK战斗"]) {
        fight_unit["凤舞九天"] = G.FightUnitUtils.check_fight_unit_fushi_skill(fight_unit, "凤舞九天");
    }
    if (G.FightUnitUtils.check_fight_unit_fushi_skill(fight_unit, "天雷地火") && !fight_data["PK战斗"]) {
        fight_unit["天雷地火"] = G.FightUnitUtils.check_fight_unit_fushi_skill(fight_unit, "天雷地火");
    }
    if (G.FightUnitUtils.check_fight_unit_fushi_skill(fight_unit, "风卷残云")) {
        fight_unit["风卷残云"] = G.FightUnitUtils.check_fight_unit_fushi_skill(fight_unit, "风卷残云");
    }
    if (G.FightUnitUtils.check_fight_unit_fushi_skill(fight_unit, "石破天惊")) {
        fight_unit["石破天惊"] = G.FightUnitUtils.check_fight_unit_fushi_skill(fight_unit, "石破天惊");
    }
    if (G.FightUnitUtils.check_fight_unit_fushi_skill(fight_unit, "索命无常") && !fight_data["PK战斗"]) {
        fight_unit["索命无常"] = G.FightUnitUtils.check_fight_unit_fushi_skill(fight_unit, "索命无常");
    }
    if (G.FightUnitUtils.check_fight_unit_fushi_skill(fight_unit, "网罗乾坤") && !fight_data["PK战斗"]) {
        fight_unit["网罗乾坤"] = G.FightUnitUtils.check_fight_unit_fushi_skill(fight_unit, "网罗乾坤");
    }
    if (G.FightUnitUtils.check_fight_unit_fushi_skill(fight_unit, "销魂噬骨") && !fight_data["PK战斗"]) {
        fight_unit["销魂噬骨"] = G.FightUnitUtils.check_fight_unit_fushi_skill(fight_unit, "销魂噬骨");
    }
    if (G.FightUnitUtils.check_fight_unit_fushi_skill(fight_unit, "行云流水") && !fight_data["PK战斗"]) {
        fight_unit["行云流水"] = G.FightUnitUtils.check_fight_unit_fushi_skill(fight_unit, "行云流水");
    } if (G.FightUnitUtils.check_fight_unit_fushi_skill(fight_unit, "烟雨飘摇") && !fight_data["PK战斗"]) {
        fight_unit["烟雨飘摇"] = G.FightUnitUtils.check_fight_unit_fushi_skill(fight_unit, "烟雨飘摇");
    }
}

/**
 * 处理角色单位的法宝属性加成
 * @param {*} fight_data 
 * @param {*} fight_unit 
 */
function load_characters_unit_fabao(fight_data, fight_unit) {
    let fabao_names = G.ItemUtils.sects_fabao_names[fight_unit["门派"]];
    if (fabao_names.length > 0) {
        let characters = _CharactersData.get(fight_unit["id"]);
        for (let index = 0; index < characters["法宝佩戴"].length; index++) {
            let fb = characters["法宝佩戴"][index];
            // 被动类法宝
            // if (fb && fabao_names.includes(fb["名称"]) && fb["使用"] === 0) {
            if (fb && fabao_names.includes(fb["名称"])) {
                //如果法宝配置了属性加成算法则走算法
                if (_FaBaoData.has(fb["名称"]) && _FaBaoData.get(fb["名称"])["属性加成"]) {
                    _FaBaoData.get(fb["名称"])["属性加成"](fight_data, fight_unit, fb);
                }
            }
        }
    }
}


const add_active_skill = ["月光", "剑荡四方", "水攻", "落岩", "雷击", "烈火", "地狱烈火", "奔雷咒", "水漫金山", "泰山压顶", "善恶有报", "特色善恶有报", "壁垒击破", "惊心一剑", "夜舞倾城", "力劈华山", "上古灵符", "法术防御", "死亡召唤", "八凶法阵", "流沙轻音", "叱咤风云", "食指大动", "天降灵葫", "无畏布施", "北冥之渊", "水击三千", "扶摇万里", "灵能激发", "法力陷阱", "超级三昧真火", "超级奔雷咒", "超级壁垒击破", "超级地狱烈火", "超级水漫金山", "超级泰山压顶", "超级永恒"];

/**
 * 为参战单位添加技能属性
 * @param {*} fight_data 
 * @param {*} fight_unit 
 * @param {*} skill_name_list 
 * @returns 
 */
export function add_fight_unit_skill_attribute(fight_data, fight_unit, skill_name_list) {
    console.debug(`为参战单位添加技能属性, 编号: ${fight_unit["编号"]}, 技能: ${skill_name_list}`)
    fight_unit["已加技能"] = new Set();
    for (let index = 0; index < skill_name_list.length; index++) {
        let skill_name = skill_name_list[index];
        // 如果是主动技能则直接添加自身等级主动技能
        if (add_active_skill.includes(skill_name)) {
            console.debug(`添加主动技能 ====> ${skill_name}`)
            fight_unit["主动技能"].push({ "名称": skill_name, "等级": fight_unit["等级"] })
        } else {
            // 从技能配置中寻找并运行技能属性算法
            let skill_data = G.SkillData.default[skill_name];
            if (skill_data && skill_data["技能属性"]) {
                console.debug(`计算技能属性加成 ====> ${skill_name}`)
                skill_data["技能属性"](fight_data, fight_unit);
                console.debug(`计算技能属性加成完成 ====> ${skill_name}`)
            } else {
                console.warn(`未定义技能 ${skill_name} 的技能属性算法`);
            }
        }
    }
    fight_unit["已加技能"] = undefined;
    console.debug(`为参战单位添加技能属性结束`)
}

// 不扣除法宝灵气的战斗类型
/**
 * 扣除法宝灵气
 * @param {*} fight_data 
 * @param {*} fb 
 * @param {*} num 
 * @returns 
 */
export function remove_unit_fabao_lingqi(fight_data, fb, num) {
    if (!fight_data["PK战斗"]) {
        if (fb["魔法"] < num) {
            return false;
        } else {
            // 判断当前回合是否扣除过
            if (fb["回合扣除"] !== fight_data["回合"]) {
                fb["回合扣除"] = fight_data["回合"];
                fb["魔法"] -= num;
            }
            return true;
        }
    }
    return true;
}

/**
 * 初始化战斗单位的一些属性信息
 * @param {*} fight_unit 
 */
export function init_uint_data(fight_unit) {
    fight_unit["显示饰品"] = false;
    fight_unit["死亡"] = false;
    fight_unit["法术状态"] = {};
    fight_unit["符石技能效果"] = {};
    // TODO 套装效果追加法术
    fight_unit["追加法术"] = {};
    // fight_unit["披坚执锐"] = {};
    fight_unit["附加状态"] = [];
    fight_unit["灵元"] = { "数值": 0, "回合": 7 };
    fight_unit["愤怒"] = 0;
    fight_unit["战意"] = 0;
    fight_unit["超级战意"] = 0;
    fight_unit["五行珠"] = 0;
    fight_unit["人参果"] = { "枚": 0, "回合": 4 };
    fight_unit["套装追加概率"] = 0;
    fight_unit["骤雨"] = { "层数": 0, "回合": 4 };
    fight_unit["连击"] = 0;
    fight_unit["法连"] = 0;
    fight_unit["护盾"] = 0;
    fight_unit["法暴"] = 0;
    fight_unit["必杀几率"] = 5;
    fight_unit["超级必杀"] = 0;
    fight_unit["附加必杀几率"] = 0;
    fight_unit["追加概率"] = 0;
    fight_unit["临时速度"] = fight_unit["速度"] || 0;
    fight_unit["无心插柳"] = false;
    if (fight_unit["修炼"]) {
        fight_unit["攻击修炼"] = fight_unit["修炼"]["攻击修炼"][0];
        fight_unit["法术修炼"] = fight_unit["修炼"]["法术修炼"][0];
        fight_unit["防御修炼"] = fight_unit["修炼"]["防御修炼"][0];
        fight_unit["抗法修炼"] = fight_unit["修炼"]["抗法修炼"][0];
        fight_unit["猎术修炼"] = fight_unit["修炼"]["猎术修炼"][0];
    } else {
        fight_unit["攻击修炼"] = 0;
        fight_unit["法术修炼"] = 0;
        fight_unit["防御修炼"] = 0;
        fight_unit["抗法修炼"] = 0;
        fight_unit["猎术修炼"] = 0;
    }
    fight_unit["装备伤害"] = 0;
    if (!fight_unit["气血回复效果"]) {
        fight_unit["气血回复效果"] = 0;
    }
    if (!fight_unit["法术伤害结果"]) {
        fight_unit["法术伤害结果"] = 0;
    }
    if (!fight_unit["固定伤害"]) {
        fight_unit["固定伤害"] = 0;
    }
    if (!fight_unit["治疗能力"]) {
        fight_unit["治疗能力"] = 0;
    }
    if (!fight_unit["装备敏捷"]) {
        fight_unit["装备敏捷"] = 0;
    }
    // 套装的
    fight_unit["攻击五行"] = "无";
    fight_unit["防御五行"] = G.RandomUtils.random_wx();
    fight_unit["统计数据"] = { "攻击": 0, "施法": 0, "挨打": 0, "被伤统计": { "物理": 0, "法术": 0 } };
    fight_unit["特殊状态"] = {};
    fight_unit["内丹属性"] = {};
    if (!fight_unit["招式特效"]) {
        fight_unit["招式特效"] = {};
    }
}

/**
 * 加载装备特效
 * @param {*} fight_unit 
 */
function load_characters_unit_equipment_effect(fight_unit) {
    let effect = G.Characters.get_equipment_effect(fight_unit["id"]);
    if (effect.includes("愤怒")) {
        fight_unit["特效愤怒"] = 0.8;
    }
    if (effect.includes("暴怒")) {
        fight_unit["特效暴怒"] = true;
    }
    if (effect.includes("神佑")) {
        fight_unit["神佑"] = 20;
    }
    if (effect.includes("必中")) {
        fight_unit["必中"] = true;
    }
    if (effect.includes("神农")) {
        fight_unit["神农"] = 1.1;
    }
    if (effect.includes("绝杀")) {
        fight_unit["绝杀"] = fight_unit["等级"] * 20;
    }
    if (effect.includes("再生")) {
        fight_unit["再生"] = Math.floor(fight_unit["等级"] / 3);
    }
}

/**
 * 计算角色参战单位的数据
 * @param {*} fight_data 
 * @param {*} fight_unit 
 */
export function computing_characters_fight_unit_data(fight_data, fight_unit) {
    console.debug(`[${fight_data["id"]}] 计算角色战斗单位属性`);
    let aq_level = G.Characters.get_skill_level(fight_unit, "辅助技能", "暗器技巧");
    fight_unit["暗器"] = Math.floor(aq_level * aq_level / 150 + aq_level);
    //加载装备特技
    fight_unit["特技"] = G.Characters.get_equipment_ex_skill(fight_unit["id"]);
    //加载装备特效
    load_characters_unit_equipment_effect(fight_unit);
    // 取灵饰属性
    for (let index = 0; index < G.ItemUtils.ls_zdsx.length; index++) {
        let lszdsx = G.ItemUtils.ls_zdsx[index];
        if (lszdsx === "穿刺等级" || lszdsx === "狂暴等级") {
            fight_unit[lszdsx] = (fight_unit[lszdsx] / fight_unit["等级"] / 30).toFixed(3);
        }
    }
    fight_unit["主动技能"] = [];
    fight_unit["被动技能"] = [];
    // 妙手空空 技能判断
    for (let index = 0; index < fight_unit["剧情技能"].length; index++) {
        let skill = fight_unit["剧情技能"][index];
        if (skill["名称"] === "妙手空空") {
            fight_unit["主动技能"].push(skill);
        }
    }
    //门派主动技能和被动技能组装
    if (fight_unit["门派"] !== "无门派") {
        for (let index = 0; index < fight_unit["师门技能"].length; index++) {
            let skill = fight_unit["师门技能"][index];
            //每次取角色的技能实际等级
            let characters = _CharactersData.get(fight_unit["id"])
            let skill_level = characters["师门技能"][index]["等级"];
            // TODO 符石加的额外技能等级
            let fs_skill_level = fight_unit["额外技能等级"][skill["名称"]] || 0;
            let fb_skill_level = fight_unit["额外法宝等级"][skill["名称"]] || 0;
            let sum_level = skill_level + fs_skill_level + fb_skill_level;
            skill["等级"] = sum_level;
            for (let sub_skill_name in skill["包含技能"]) {
                let sub_skill = skill["包含技能"][sub_skill_name];
                if (sub_skill["学会"]) {
                    if (G.Skill.passive_skill.includes(sub_skill_name)) {
                        fight_unit["被动技能"].push({ "名称": sub_skill_name });
                    }
                    if (G.Skill.active_skill.includes(sub_skill_name)) {
                        fight_unit["主动技能"].push({ "名称": sub_skill_name, "等级": sum_level });
                    }
                }
            }
        }
    } else if (fight_unit["门派"] === "无门派" && fight_unit["等级"] < 10) {
        fight_unit["主动技能"].push({ "名称": "牛刀小试", "等级": fight_unit["等级"] });
    }

    // 调试模式添加两个秒杀技能
    if (debug_mode) {
        // fight_unit["主动技能"].push({ "名称": "龙吟", "等级": 99999 });
        fight_unit["主动技能"].push({ "名称": "龙卷雨击", "等级": 99999 });
    }

    // 	TODO self:检查套装效果(n, self.参战单位[n].玩家id)

    // 加载变身属性
    load_characters_unit_bianshen(fight_unit);

    // 加载符石技能效果
    load_characters_unit_fushi_skill(fight_data, fight_unit);

    // 加载法宝加成
    load_characters_unit_fabao(fight_data, fight_unit);

    // 神器的全局属性加成
    if (fight_unit["神器"] && fight_unit["神器"]["佩戴"]) {
        if (fight_unit["神器"]["技能"][0] === "狂战") {
            fight_data["全局属性"][fight_unit["队伍"]]["狂战"] = fight_unit["编号"];
        }
    }

    // 加载奇经八脉属性
    if (fight_unit["门派"] !== "无门派" && fight_unit["奇经八脉"]) {
        // 批量执行经脉属性算法
        let sects_jing_mai_data = G.JingMaiData.default[fight_unit["门派"]];
        // 门派纬度的属性加成算法
        if (sects_jing_mai_data["门派战斗属性加成"]) {
            sects_jing_mai_data["门派战斗属性加成"](fight_data, fight_unit);
        }
        // 已点经脉
        for (const key in fight_unit["奇经八脉"]) {
            if (fight_unit["奇经八脉"][key] === 1 && sects_jing_mai_data[key] && sects_jing_mai_data[key]["战斗属性加成"]) {
                sects_jing_mai_data[key]["战斗属性加成"](fight_data, fight_unit);
            }
        }
    }

    // TODO 灵饰套装
    // 	let user = 玩家数据[self.参战单位[n].玩家id]
    //   if user.角色.灵饰[1] && user.角色.灵饰[1] !== 0){
    //     if user.道具.数据[user.角色.灵饰[1]].特性 && user.道具.数据[user.角色.灵饰[1]].特性.套装){
    //       if user.道具.数据[user.角色.灵饰[1]].特性.技能 === "心源" && G.RandomUtils.chance() <= 90){
    //         self.参战单位[n].伤害 = math.floor(self.参战单位[n].伤害 *(PropertyData[user.道具.数据[user.角色.灵饰[1]].特性.技能]["套装" .. user.道具.数据[user.角色.灵饰[1]].特性.套装] / 100 + 1))
    //         self.参战单位[n].灵力 = math.floor(self.参战单位[n].灵力 *(PropertyData[user.道具.数据[user.角色.灵饰[1]].特性.技能]["套装" .. user.道具.数据[user.角色.灵饰[1]].特性.套装] / 100 + 1))
    //       end
    //     end
    //   end
    //   	if self.参战单位[n].黎魂){
    // 	    if 取随机数(1, 1000) <= (15 + (self.参战单位[n].黎魂加成 || 0)) * 10){
    // 			self.参战单位[n].黎魂 = self.参战单位[n].黎魂 + 1
    // 		}
    // 	end
    console.debug(`[${fight_data["id"]}] 计算角色战斗单位属性完成`);
}

/**
 * 计算召唤兽战斗单位属性
 * @param {*} fight_data 
 * @param {*} fight_unit 
 */
export function computing_pet_unit_data(fight_data, fight_unit) {
    console.debug(`[${fight_data["id"]}] 计算召唤兽战斗单位属性`);

    // if (self.参战单位[n].装备 ){ // TODO 召唤兽套装 要检查
    // 	self:检查bb套装(self.参战单位[n])
    // end

    // TODO self:刷新丸子技能(n)

    fight_unit["主动技能"] = [];
    for (let index = 0; index < fight_unit["技能"].length; index++) {
        let skill_name = fight_unit["技能"][index];
        if (G.Skill.passive_skill.includes(skill_name)) {
            fight_unit["被动技能"].push({ "名称": skill_name });
        }
        if (G.Skill.active_skill.includes(skill_name)) {
            fight_unit["主动技能"].push({ "名称": skill_name, "等级": fight_unit["等级"] });
        }
    }
    // 添加技能属性
    add_fight_unit_skill_attribute(fight_data, fight_unit, fight_unit["技能"]);

    let characters_id = fight_unit["认证码"].split("_")[0];
    let ty = G.Pet.get_pet_tong_yu(Number(characters_id), fight_unit["认证码"]);
    if (ty) {
         console.debug(`计算统御坐骑技能加成属性`)
        // TODO 被统御计算坐骑技能加成
        if (ty[1]["开天辟地"] !== 0) {
            fight_unit["伤害"] += Math.floor(fight_unit["力量"] * 0.05 * ty[1]["开天辟地"]);
        }
        if (ty[1]["破釜沉州"] !== 0) {
            fight_unit["必杀几率"] += Math.floor(fight_unit["必杀几率"] * 2 * ty[1]["破釜沉州"]);
        }
        console.debug(`计算统御坐骑技能加成属性结束`)
    }
    // 内丹战斗属性加成
     console.debug(`计算内丹战斗属性加成`)
     console.debug(fight_unit["内丹"])
    for (let index = 0; index < fight_unit["内丹"]["数据"].length; index++) {
        let nei_dan = fight_unit["内丹"]["数据"][index];
        let nei_dan_data = G.NeiDanData.default[nei_dan["技能"]];
        let base = 1 + (nei_dan["等级"] * 0.2) + fight_unit["成长"];
        // 如果设置了坐骑统御则加上坐骑成长
        if (ty) {
            base = base + ty[0] - 1;
        }
        if (nei_dan_data && nei_dan_data["召唤兽属性加成"]) {
            console.debug(`计算内丹召唤兽属性加成 ${nei_dan["技能"]}`)
            nei_dan_data["召唤兽属性加成"](fight_unit, base);
            console.debug(`计算内丹召唤兽属性加成结束 ${nei_dan["技能"]}`)
        }
    }
    console.debug(`计算内丹战斗属性加成结束`)

    // if (self.参战单位[n].进阶  && self.参战单位[n].进阶.开启 && self.参战单位[n].进阶.特性 !== "无"){
    // TODO 会用到增益技能计算
    // 	self:添加特性属性(n, self.参战单位[n].进阶) 
    // end

    // self:添加召唤兽属性(self.参战单位[n])

    // self:添加bb法宝属性(n)

    // if (self.参战单位[n].统御属性){
    // 	if self.参战单位[n].统御属性.飞火流星 ){
    // 		self.参战单位[n].速度=Math.floor(self.参战单位[n].速度-self.参战单位[n].统御属性.飞火流星)
    // 	end
    // 	if self.参战单位[n].统御属性.开天辟地 ){
    // 		self.参战单位[n].伤害=Math.floor(self.参战单位[n].伤害+self.参战单位[n].统御属性.开天辟地)
    // 	end
    // 	if self.参战单位[n].统御属性.破釜沉州 ){
    // 		self.参战单位[n].必杀=self.参战单位[n].必杀+self.参战单位[n].统御属性.破釜沉州
    // 		self.参战单位[n].命中=self.参战单位[n].命中+50;
    // 	end
    // end
    console.debug(`[${fight_data["id"]}] 计算召唤兽战斗单位属性结束`);
}

/**
 * 计算怪物战斗单位属性
 * @param {*} fight_data 
 * @param {*} fight_unit 
 */
export function computing_monster_unit_data(fight_data, fight_unit) {
    console.debug(`[${fight_data["id"]}] 计算怪物战斗单位属性`);
    let skill_name_list = fight_unit["主动技能"]
    fight_unit["主动技能"] = [];
    for (let index = 0; index < skill_name_list.length; index++) {
        fight_unit["主动技能"].push({ "名称": skill_name_list[index], "等级": fight_unit["等级"] });
    }
    skill_name_list = fight_unit["被动技能"]
    fight_unit["被动技能"] = [];
    for (let index = 0; index < skill_name_list.length; index++) {
        fight_unit["被动技能"].push({ "名称": skill_name_list[index] });

    }
    // 添加技能属性
    add_fight_unit_skill_attribute(fight_data, fight_unit, fight_unit["技能"]);
    console.debug(`[${fight_data["id"]}] 计算怪物战斗单位属性完成`);
}


/**
 * 增加五行珠
 * @param {*} fight_unit 
 */
export function add_wu_xing_zhu(fight_data, fight_unit) {
    if (fight_unit["五行珠"] < 6) {
        fight_unit["五行珠"] += 1;
    }
    if (check_fight_unit_jingmai(fight_unit, "普陀山", "湛然") && fight_unit["五行珠"] === 5 && !fight_unit["法术状态"]["剑意莲心"] && G.RandomUtils.chance(40)) {
        G.FightStatusUtils.add_unit_status(fight_data, fight_unit, fight_unit, "剑意莲心", 11);
    }
    if (check_fight_unit_jingmai(fight_unit, "普陀山", "顿悟")) {
        add_fen_nu(fight_unit, fight_unit["五行珠"]);

    }
    if (fight_unit["五行珠"] > 6) {
        fight_unit["五行珠"] = 6;
    }
}

/**
 * 消耗五行珠
 * @param {*} fight_unit 
 * @returns 
 */
export function consummer_wu_xing_zhu(fight_unit) {
    if (fight_unit["五行珠"] >= 1) {
        fight_unit["五行珠"] -= 1;
        if (check_fight_unit_jingmai(fight_unit, "普陀山", "无尽")) {
            fight_unit["伤害"] += 8;
        }
        return true;
    }
    return false;
}

/**
 * 增加愤怒
 * @param {*} fight_unit 
 * @param {*} num 
 * @param {*} is_jc 
 * @returns 
 */
export function add_fen_nu(fight_unit, num, is_jc = true) {
    if (fight_unit["威吓"]) {
        return
    }
    if (fight_unit["愤怒"]) {
        if (fight_unit["特效暴怒"] && !is_jc) {
            num = num * 1.2;
        }
        fight_unit["愤怒"] += Math.floor(num);
    }
    if (fight_unit["愤怒"] > 150) {
        fight_unit["愤怒"] = 150;
    }
}

/**
 * 减少愤怒
 * @param {*} fight_unit 
 * @param {*} num 
 * @returns 
 */
export function remove_fen_nu(fight_unit, num) {
    if (fight_unit["愤怒"] < num) {
        fight_unit["愤怒"] = 0;
    } else {
        fight_unit["愤怒"] -= num;
    }
}

/**
 * 增加战意
 * @param {*} fight_unit 
 * @param {*} num 
 * @returns 
 */
export function add_zhan_yi(fight_unit, num) {
    if (fight_unit["门派"] !== "凌波城") {
        return
    }
    let max = 6;
    for (let index = 0; index < num; index++) {
        if (fight_unit["战意"] < 6) {
            fight_unit["战意"] += 1;
            if (check_fight_unit_passive_skill(fight_unit, "超级战意") && G.RandomUtils.chance(20)) {
                fight_unit["战意"] += 1;
            }
        }
    }
    if (fight_unit["战意"] > 6) {
        fight_unit["战意"] = 6;
    }
}
/**
 * 增加超级战意
 * @param {*} fight_unit 
 * @param {*} num 
 * @returns 
 */
export function add_super_zhan_yi(fight_unit, num) {
    if (fight_unit["门派"] !== "凌波城") {
        return;
    }
    fight_unit["战意"] += num;
    fight_unit["超级战意"] += num;
    if (fight_unit["超级战意"] > 3) {
        fight_unit["超级战意"] = 3;
    }
}


/**
 * 获取战斗单位法宝境界
 * @param {*} fight_unit 
 * @param {*} name 
 * @returns 
 */
export function get_unit_fa_bao_jingjie(fight_unit, name) {
    for (let index = 0; index < fight_unit["法宝佩戴"].length; index++) {
        let fb = fight_unit["法宝佩戴"][index];
        if (fb !== null && fb["名称"] === name) {
            return fb["境界"];
        }
    }
    return 0
}

/**
 * TODO 取指定法宝 判定是否有指定法宝并且灵气可以扣除
 * @param {*} fight_unit 
 * @param {*} fb_name 
 * @returns 
 */
export function check_unit_fa_bao(fight_data, fight_unit, fb_name) {
    if (fight_unit &&  fight_unit["法术状态"] && (fight_unit["法术状态"]["番天印"] || fight_unit["法术状态"]["无字经"] || fight_unit["法术状态"]["娉婷袅娜"])) {
        return false;
    }

    let characters = _CharactersData.get(fight_unit["id"]);
    // 角色的法宝
    if (fight_unit["类型"] === "角色" && characters && characters["法宝佩戴"]) {
        let excute = false;
        let first_fb = null;
        let count = 0

        for (let index = 0; index < characters["法宝佩戴"].length; index++) {
            let fb = characters["法宝佩戴"][index];
            if (fb && fb["名称"] === fb_name) {
                count++;
                if (first_fb === null) {
                    first_fb = fb;
                }
            }
        }
        if (count >= 2) {
            count = 2;
        }

        if (count > 0) { //是否有，避免重复取值
            if (fb_name === "金甲仙衣") {
                if (G.RandomUtils.chance(first_fb["境界"] * 2.5 * count + 9)) {
                    excute = true;
                }
            } else if (fb_name === "降魔斗篷") {
                if (G.RandomUtils.chance(first_fb["境界"] * count + 14)) {
                    excute = true;
                }
            } else if (fb_name === "嗜血幡") {
                let js = 1
                if (G.RandomUtils.chance(Math.floor((first_fb["境界"] * 2.5 * count + 9) / js) - 4)) {
                    excute = true;
                }
            } else if (fb_name === "七宝玲珑灯") {
                if (G.RandomUtils.chance(first_fb["境界"] * 2 + 9)) {
                    excute = true;
                }
            } else if (fb_name === "蟠龙玉璧") {
                if (G.RandomUtils.chance(first_fb["境界"] * 1.5 + 3)) {
                    excute = true;
                }
            } else if (fb_name === "慈悲") {
                if (G.RandomUtils.chance(first_fb["境界"] + 5)) {
                    excute = true;
                }
            } else if (fb_name === "谷玄星盘") {
                if (G.RandomUtils.chance(first_fb["境界"] * 0.6 + 2)) {
                    excute = true;
                }
            } else if (fb_name === "救命毫毛") {
                let gl = first_fb["境界"] * 2 + 5;
                if (fight_unit["精炼"]) {
                    gl = gl + fight_unit["精炼"]["回合"] * 10;
                }
                if (check_fight_unit_jingmai(fight_unit, "方寸山", "不倦")) {
                    gl = gl + 15;
                } else if (check_fight_unit_jingmai(fight_unit, "方寸山", "妙用")) {
                    gl = gl + 15;
                }
                if (G.RandomUtils.chance(gl)) {
                    excute = true;
                }
                else
                    excute = true;
            }
            if (excute) {
                if (fight_data["PK战斗"]) {
                    return true;
                }
                if (remove_unit_fabao_lingqi(fight_data, first_fb, 1)) {
                    return true;
                } else {
                    return false;
                }
            }
        }
        // 其他单位的法宝
    } else if (fight_unit["法宝佩戴"]) {
        let excute = false
        let target = fight_unit;
        if (fight_unit["认证码"]) {
            // 如果是召唤兽则应当实际扣除其法宝灵气
            let master = fight_unit["主人编号"];
            let master_unit = G.FightUtils.get_fight_unit_by_number(fight_data, master["编号"]);
            let characters = _CharactersData.get(master_unit["id"]);
            target = G.Characters.get_characters_fight_pet_data(characters);
        }
        // 取法宝
        for (let index = 0; index < fight_unit["法宝佩戴"].length; index++) {
            let fb = fight_unit["法宝佩戴"][index];
            if (fb["名称"] === fb_name) {
                if (fb_name === "金甲仙衣") {
                    if (G.RandomUtils.chance(9 * 2 + 9)) {
                        excute = true;
                    }
                } else if (fb_name === "降魔斗篷") {
                    if (G.RandomUtils.chance(9 * 2 + 9)) {
                        excute = true;
                    }
                } else if (fb_name === "七宝玲珑灯") {
                    if (G.RandomUtils.chance(9 * 2 + 9)) {
                        excute = true;
                    }
                } else if (fb_name === "慈悲") {
                    if (G.RandomUtils.chance(12 + 5)) {
                        excute = true;
                    }
                    else
                        excute = true;
                }
                if (excute) {
                    if (fight_data["PK战斗"]) {
                        return true;
                    }
                    if (remove_unit_fabao_lingqi(fight_data, fb, 1)) {
                        return true;
                    } else {
                        return false;
                    }
                }
            }
        }
    }
    return false;
}

/**
 * 为参战单位增加气血
 * @param {*} fight_unit 
 * @param {*} hp 
 */
export function add_unit_hp(fight_unit, hp) {
    console.debug(`参战单位增加气血开始 编号 ${fight_unit["编号"]} 气血 ${fight_unit["气血"]} hp ${hp}`)
    fight_unit["气血"] += Math.floor(hp);
    if (fight_unit["气血"] > fight_unit["最大气血"]) {
        fight_unit["气血"] = fight_unit["最大气血"];
    }
    console.debug(`参战单位增加气血结束 编号 ${fight_unit["编号"]} 气血 ${fight_unit["气血"]} hp ${hp}`)
}

/**
 * 为参战单位增加魔法
 * @param {*} fight_unit 
 * @param {*} mp 
 */
export function add_unit_mp(fight_unit, mp) {

    if (fight_unit["法术状态"]["瘴气"] && fight_unit["法术状态"]["瘴气"]["降魔"]) {
        mp = Math.floor(mp * fight_unit["法术状态"]["瘴气"]["降魔"]);
    }
    if (fight_unit["法术状态"]["腾雷"]) {
        mp = Math.floor(mp * 0.5);
    }
    if (fight_unit["法术状态"]["魔音摄魂"] && fight_unit["法术状态"]["魔音摄魂"]["迷意"]) {
        return;
    }
    if (fight_unit["魔法回复效果"]) {
        mp += fight_unit["魔法回复效果"];
    }
    fight_unit["魔法"] += mp;
    if (fight_unit["魔法"] > fight_unit["最大魔法"]) {
        fight_unit["魔法"] = fight_unit["最大魔法"];
    }
}

/**
 * 为参战单位扣除魔法
 * @param {*} fight_unit 
 * @param {*} mp 
 */
export function remove_unit_mp(fight_data, fight_unit, mp) {
    if(fight_unit["魔法"] === undefined){
        fight_unit["魔法"] = 0;
    }
    if (fight_unit["魔法"] < mp) {
        fight_unit["魔法"] = 0;
    } else {
        fight_unit["魔法"] -= mp;
    }
    sync_unit_mp(fight_data, fight_unit);
}

/**
 * 同步魔法 mp
 * @param {*} fight_unit 
 */
export function sync_unit_mp(fight_data, fight_unit) {
    if (fight_data["战斗流程"].length === 0) {
        fight_data["战斗流程"].push({});
    }
    if (fight_data["战斗流程"][fight_data["战斗流程"].length - 1]["减少魔法"] === undefined) {
        fight_data["战斗流程"][fight_data["战斗流程"].length - 1]["减少魔法"] = [];
    }
    fight_data["战斗流程"][fight_data["战斗流程"].length - 1]["减少魔法"].push({ "编号": fight_unit["编号"], "魔法": fight_unit["魔法"] });
}

/**
 * 获取参战单位的召唤兽参战信息
 * @param {*} fight_data 
 * @param {*} fight_unit 
 * @returns 
 */
export function get_fight_unit_pet(fight_data, fight_unit) {
    return fight_data["队伍数据"][fight_unit["队伍下标"]][fight_unit["下标"] + 1];
}

/**
 * 是否无法复活
 * @param {*} fight_unit 
 * @returns 
 */
export function check_not_rebirth(fight_unit) {
    if (fight_unit["气血"] > 0 || fight_unit["逃跑"] || fight_unit["捕捉"]) {
        return true;
    }
    for (let index = 0; index < G.Skill.not_rebirth_ap_status.length; index++) {
        let status = G.Skill.not_rebirth_ap_status[index];
        if (fight_unit["法术状态"][status]) {
            return false;
        }
    }
    return true;
}

/**
 * 是否处于休息状态
 * @param {*} fight_unit 
 * @returns 
 */
export function check_unit_rest_status(fight_unit) {
    for (let index = 0; index < G.Skill.rest_status.length; index++) {
        if (fight_unit["法术状态"][G.Skill.rest_status[index]]) {
            return true;
        }
    }
    return false;
}

function get_skill_cd(fight_unit, skill_name) {
    if (G.SkillData[skill_name] && G.SkillData[skill_name]["冷却回合"]) {
        return G.SkillData[skill_name]["冷却回合"](fight_unit);
    }
    return undefined;
}

/**
 * 校验并设置技能CD
 * @param {*} fight_unit 
 * @param {*} skill_name 
 * @returns 
 */
export function get_unit_ap_skill_cd(fight_unit, skill_name) {
    for (let index = 0; index < fight_unit["主动技能"].length; index++) {
        let skill = fight_unit["主动技能"][index];
        if (skill["名称"] === skill_name) {
            if (skill["剩余冷却回合"]) {
                return false;
            } else {
                // 设置冷却回合
                skill["剩余冷却回合"] = get_skill_cd(fight_unit, skill_name);
                return true;
            }
        }
    }
    return false;
}

/**
 * 查询单位是否可以攻击
 * @param {*} fight_unit 
 */
export function get_unit_attack_status(fight_unit) {
    if (fight_unit["法术状态"]["夺魄令"] && fight_unit["法术状态"]["夺魄令"]["封物理"]) {
        return false;
    }
    for (let key in fight_unit["法术状态"]) {
        if (G.Skill.desable_attack_ap_status.includes(key)) {
            return false;
        }
    }
    return true;
}

/**
 * 查询单位是否可以使用特技
 * @param {*} fight_unit 
 */
export function get_unit_ap_ex_kill_status(fight_unit) {
    for (let key in fight_unit["法术状态"]) {
        if (G.Skill.desable_ap_ex_kill_status.includes(key)) {
            return false;
        }
    }
    return true;
}

/**
 * 查询单位是否可以使用法宝
 * @param {*} fight_unit 
 */
export function get_unit_ap_fabao_kill_status(fight_unit) {
    for (let key in fight_unit["法术状态"]) {
        if (G.Skill.desable_ap_fabal_kill_status.includes(key)) {
            return false;
        }
    }
    return true;
}

/**
 * 查询单位是否可以使用法术技能
 * @param {*} fight_unit 
 */
export function get_unit_ap_kill_status(fight_unit) {
    for (let key in fight_unit["法术状态"]) {
        if (G.Skill.desable_ap_kill_status.includes(key)) {
            return false;
        }
    }
    return true;
}

/**
 * 获取参战单位是否处于可操作状态
 * @param {*} fight_unit 
 * @returns 
 */
export function get_unit_status(fight_unit) {
    if (fight_unit["不可操作"]) {
        return false;
    }
    if (fight_unit["气血"] <= 0 || fight_unit["捕捉"] || fight_unit["逃跑"]) {
        return false
    }
    return true;
}

/**
 * 获取是否可以对目标进行操作 TODO 
 * @param {*} src_unit 
 * @param {*} target_unit 
 * @param {*} type_number 1为可以攻击的敌方单位  2为队友或宝宝  3为可复活的队友
 */
export function get_target_unit_status(src_unit, target_unit, type_number = 1) {
    if (target_unit === undefined) {
        console.debug(`是否可以对目标进行操作 => 编号：${target_unit["编号"]} , ${false}`);
        return false;
    }
    if (target_unit["不可操作"]) {
        console.debug(`是否可以对目标进行操作 => 编号：${target_unit["编号"]} , ${false}`);
        return false;
    }
    if (target_unit["死亡"]) {
        console.debug(`是否可以对目标进行操作 => 编号：${target_unit["编号"]} , ${false}`);
        return false;
    }
    switch (type_number) {
        case 1:
            if (target_unit["气血"] <= 0 || target_unit["捕捉"] || target_unit["逃跑"]) {
                return false;
            } else if (target_unit["法术状态"] && (target_unit["法术状态"]["楚楚可怜"] || target_unit["法术状态"]["修罗隐身"])) {
                return src_unit["感知"] || src_unit["法术状态"]["幽冥鬼眼"] || (src_unit["法术状态"]["牛劲"] && src_unit["法术状态"]["牛劲"]["充沛"]);
            } else {
                return target_unit["法术状态"]["乾坤妙法"] === undefined;
            }
        case 2:
            if (target_unit["气血"] <= 0 || target_unit["捕捉"] || target_unit["逃跑"] || (target_unit["法术状态"] && target_unit["法术状态"]["复活"])) {
                return false;
            }
        case 3:
            if (target_unit["气血"] <= 0) {
                return true;
            }
        default:
            return true;
    }
}

/**
 * 获取参战单位的法宝五行
 * @param {*} fight_unit 
 * @returns 
 */
export function get_unit_fabao_wx(fight_unit) {
    if (fight_unit["类型"] === "角色") {
        for (let index = 0; index < fight_unit["法宝佩戴"].length; index++) {
            let fb = fight_unit["法宝佩戴"].length;
            if (fb !== null) {
                const fb = fight_unit["法宝佩戴"][index];
                let sects_name = G.ItemUtils.get_fabao_sects_name(fb["名称"]);
                // 无门派法宝或本门派法宝
                if (sects_name === "无门派" || sects_name === fight_unit["门派"]) {
                    return fb["五行"];
                }
            }
        }
    }
    return "空"
}

/**
 * 获取参战单位的装备五行
 * @param {*} fight_unit 
 * @returns 
 */
export function get_unit_equipment_wx(fight_unit, index) {
    let equipment = fight_unit["装备"][index];
    if (equipment) {
        return equipment["五行"];
    }
    return "空"
}

/**
 * 校验参战单位是否有被动技能
 * @param {*} fight_unit 
 * @param {*} skill_name 
 */
export function check_fight_unit_passive_skill(fight_unit, skill_name) {
    if (fight_unit === undefined || fight_unit["队伍"] === 0 || fight_unit["类型"] !== "角色") {
        return false;
    }
    for (let index = 0; index < fight_unit["被动技能"].length; index++) {
        let skill = fight_unit["被动技能"][index];
        if (skill["名称"] === skill_name) {
            return true;
        }
    }
    return false;
}

/**
 * 添加护盾
 * @param {*} fight_data 
 * @param {*} fight_unit 
 * @param {*} num 
 */
export function add_hu_dun_for_lt_hp(fight_data, fight_unit, num) {
    if ((fight_unit["护盾"] + num) >= fight_unit["气血"] * 0.3) {
        num = Math.floor(fight_unit["气血"] * 0.3 - fight_unit["护盾"]);
    }
    fight_unit["护盾"] += num;
    if (fight_data["战斗流程"].length === 0) {
        fight_data["战斗流程"].push({});
    }
    if (fight_data["战斗流程"][fight_data["战斗流程"].length - 1]["添加护盾"] === undefined) {
        fight_data["战斗流程"][fight_data["战斗流程"].length - 1]["添加护盾"] = [];
    }
    fight_data["战斗流程"][fight_data["战斗流程"].length - 1]["添加护盾"].push({
        "编号": fight_unit["编号"],
        "护盾": num
    });
    G.FightUtils.add_waiting_play_time(fight_data, 2, "添加护盾");
}

/**
 * 添加护盾 最大值不超过最大气血* 0.4
 * @param {*} fight_data 
 * @param {*} fight_unit 
 * @param {*} num 
 */
export function add_hu_dun_for_lt_max_hp(fight_data, fight_unit, num) {
    if ((fight_unit["护盾"] + num) > (fight_unit["最大气血"] * 0.4)) {
        num = Math.floor(fight_unit["最大气血"] * 0.4 - num);
    }
    fight_unit["护盾"] += num;
    if (fight_data["战斗流程"].length === 0) {
        fight_data["战斗流程"].push({});
    }
    if (fight_data["战斗流程"][fight_data["战斗流程"].length - 1]["添加护盾"] === undefined) {
        fight_data["战斗流程"][fight_data["战斗流程"].length - 1]["添加护盾"] = [];
    }
    fight_data["战斗流程"][fight_data["战斗流程"].length - 1]["添加护盾"].push({
        "编号": fight_unit["编号"],
        "护盾": num
    });
}

/**
 * 取行动状态 
 * @param {*} fight_data 
 * @param {*} fight_unit 
 */
export function get_unit_process_status(fight_data, fight_unit) {
    if ((fight_unit["气血"] <= 0 || fight_unit["捕捉"] || fight_unit["逃跑"]) && fight_unit["狂袭"] === undefined) {
        return false
    } else if (fight_unit["法术状态"]["催眠符"]) {
        if (fight_unit["指令"] && fight_unit["指令"]["类型"] === "召唤" && fight_unit["法术状态"]["催眠符"]["当前回合"]) {
            return true;
        }
        return false;
    } else if (fight_unit["精灵"] && fight_data["回合"] === 1) {
        return false;
    }
    // 不可行动的法术状态 TODO 应该具体细化到禁止某一项动作
    for (const key in fight_unit["法术状态"]) {
        if (G.SkillData.default[key] && G.SkillData.default[key]["不可行动"]) {
            console.debug(`不可行动 ===>  法术状态 ${key}`);
            return false;
        }
    }
    return true;
}

/**
 * 取可否防御
 * @param {*} fight_unit 
 * @returns 
 */
export function get_unit_defence_status(fight_unit) {
    let data = (fight_unit["法术状态"]["横扫千军"] || fight_unit["法术状态"]["破釜沉舟"] || fight_unit["法术状态"]["催眠符"]
        || fight_unit["法术状态"]["楚楚可怜"] || fight_unit["法术状态"]["乾坤妙法"]);
    return !data;
}


/**
 * 取异常状态法术
 * @param {*} fight_unit 
 */
export function get_error_ap_status(fight_unit) {
    let result = [];
    if (fight_unit["法术状态"]) {
        for (const status_key in fight_unit["法术状态"]) {
            if (G.Skill.error_status_ap.includes(status_key)) {
                result.push(status_key);
            }
        }
    }
    return result;
}

/**
 * 取吸血异常状态
 * @param {*} fight_unit 
 * @returns 
 */
export function get_error_xx_status(fight_unit) {
    let result = [];
    if (fight_unit["法术状态"]) {
        for (const status_key in fight_unit["法术状态"]) {
            if (G.Skill.error_xx_status_ap.includes(status_key)) {
                result.push(status_key);
            }
        }
    }
    return result;
}

/**
 * 取装备宝石等级
 * @param {*} fight_unit 
 * @param {*} index 
 * @returns 
 */
export function get_equipment_baosi_level(fight_unit, index) {
    if (fight_unit["类型"] === "角色") {
        let equipment = fight_unit["装备"][index];
        if (equipment !== null && equipment["锻炼等级"]) {
            return equipment["锻炼等级"];
        }
    }
    return 0;
}

/**
 * 技能消耗
 * @param {*} fight_data 
 * @param {*} fight_unit 
 * @param {*} type 
 * @param {*} value 
 * @param {*} skill_name 
 * @returns 
 */
export function excute_unit_skill_consummer(fight_data, fight_unit, type, value, skill_name) {
    console.debug(`技能消耗开始 编号 ${fight_unit["编号"]} 类型 ${type}  value ${value} skill_name ${skill_name} 原始值 ${fight_unit[type]}`)
    switch (type) {
        case "无":
            return true;
        case "魔法":
            return consummer_unit_mp(fight_unit, value);
        case "魔法和气血":
            return consummer_unit_mp(fight_unit, value);
        case "气血":
            return consummer_unit_hp(fight_unit, value);
        case "战意":
            return consummer_unit_zhan_yi(fight_data, fight_unit, value, skill_name);
        case "特技消耗":
            return consummer_unit_ex_skill(fight_data, fight_unit, value, skill_name);
        case "魔法和愤怒":
            return consummer_unit_mp_and_fen_nu(fight_unit, value[0], value[1]);
        case "木精":
            return consummer_unit_mp_and_mujing(fight_data, fight_unit, value[0], value[1], skill_name);
        case "金鸦火羽（高级）":
            // TODO 化圣未写
            return true;
        case "风灵":
            return consummer_fengling(fight_data, fight_unit, value);
        default:
            return true;
    }
}

/**
 * 魔法和木精消耗
 * @returns 
 */
function consummer_unit_mp_and_mujing(fight_data, fight_unit, mp, mj, skill_name) {
    if (fight_unit["慧根"]) {
        mp = Math.floor(fight_unit["慧根"] * mp);
    }
    if (fight_unit["法术状态"]["罗汉珠"]) {
        mp = Math.floor(mp * (1 - fight_unit["法术状态"]["罗汉珠"]["境界"] * 0.04));
    }
    if (fight_unit["魔法"] < mp || fight_unit["法术状态"]["木精"] === undefined || fight_unit["法术状态"]["木精"]["层数"] < mj) {
        return false;
    } else {
        fight_unit["法术状态"]["木精"]["层数"] -= mj;
        if (fight_unit["法术状态"]["木精"]["层数"] <= 0) {
            G.FightStatusUtils.relieve_status(fight_data, fight_unit, "木精");

        }
        fight_unit["魔法"] -= mp;
        if (check_fight_unit_jingmai(fight_unit, "神木林", "归原")) {
            G.FightComputingUtils.add_target_hp_and_play(fight_data, fight_unit, mj * fight_unit["等级"] * 4);
        }
        // TODO 暂时先放这里
        if (skill_name === "枯木逢春") {
            G.FightStatusUtils.add_unit_status(fight_data, fight_unit, fight_unit, "风灵", 69, 2);
        } else if (check_fight_unit_jingmai(fight_unit, "神木林", "灵精") && G.RandomUtils.chance(20)) {
            G.FightStatusUtils.add_unit_status(fight_data, fight_unit, fight_unit, "风灵", 69, "木精");
        }
        return true;
    }
}

/**
 * 消耗魔法和愤怒
 * @param {*} fight_unit 
 * @param {*} mp 
 * @param {*} fn 
 * @returns 
 */
function consummer_unit_mp_and_fen_nu(fight_unit, mp, fn) {
    if (fight_unit["慧根"]) {
        mp = Math.floor(fight_unit["慧根"] * mp);
    }
    if (fight_unit["法术状态"]["罗汉珠"]) {
        mp = Math.floor(mp * (1 - fight_unit["法术状态"]["罗汉珠"]["境界"] * 0.04));
    }
    if (fight_unit["魔法"] < mp || fight_unit["愤怒"] < fn) {
        return false;
    } else {
        remove_fen_nu(fight_unit, fn);
        remove_unit_mp(fight_unit, mp);
        return true;
    }
}

/**
 * 特技消耗算法
 * @param {*} fight_data 
 * @param {*} src_unit 
 * @param {*} value 
 * @param {*} skill_name 
 * @returns 
 */
function consummer_unit_ex_skill(fight_data, src_unit, value, skill_name) {
    value = Math.floor(value * (src_unit["特效愤怒"] || 1));
    if (src_unit["门派"] === "女儿村") {
        if (check_fight_unit_jingmai(src_unit, "女儿村", "傲娇")) {
            value -= 4;
        } else if (check_fight_unit_jingmai(src_unit, "女儿村", "空灵")) {
            G.FightStatusUtils.add_unit_status(fight_data, src_unit, src_unit, "空灵", 69)
        }
    }
    let res = true;
    if (value <= src_unit["愤怒"]) {
        if (src_unit["修心"] === undefined && check_fight_unit_jingmai(src_unit, "五庄观", "修心") && src_unit["魔法"] >= value * 20) {
            src_unit["修心"] = 1
            remove_unit_mp(src_unit, value * 20);
            res = true
        }
    } else {
        if (src_unit["亢强"]) {
            src_unit["亢强"] = value * 0.2;
        }
        if (check_fight_unit_jingmai(src_unit, "大唐官府", "催迫") && value >= 120) {
            src_unit["催迫"] = 1;
        }
        if (check_fight_unit_jingmai(src_unit, "天宫", "趁虚")) {
            G.FightStatusUtils.add_unit_status(fight_data, src_unit, src_unit, "趁虚", 11);
        }
        if (check_fight_unit_jingmai(src_unit, "天宫", "怒电") && value >= 120 && G.RandomUtils.chance(50)) {
            G.FightStatusUtils.add_unit_status(fight_data, src_unit, src_unit, "怒电", 69);
        }
        if (check_fight_unit_jingmai(src_unit, "天宫", "存雄")) {
            G.FightStatusUtils.add_unit_status(fight_data, src_unit, src_unit, "存雄", 69);
        }
        if (check_fight_unit_jingmai(src_unit, "阴曹地府", "鬼火") && value <= 90) {
            add_fen_nu(src_unit, 16);
        }
        if (src_unit["门派"] === "凌波城" && check_fight_unit_jingmai(src_unit, "凌波城", "聚气") && value >= 60) {
            add_zhan_yi(src_unit, 1);
        }
        if (src_unit["门派"] === "魔王寨" && check_fight_unit_jingmai(src_unit, "魔王寨", "烬藏") && value >= 120) {
            remove_unit_skill_cd(src_unit, "秘传三昧真火", 1);
            remove_unit_skill_cd(src_unit, "秘传飞砂走石", 1);
        }
        if (check_unit_shen_qi_skill(src_unit, "万物滋长")) {
            add_hu_dun_for_lt_hp(src_unit, src_unit["神器"]["等级"] * src_unit["等级"] * 0.05);
        }
    }
    let skill_data = G.SkillData.default[skill_name];
    if (res) {
        remove_fen_nu(src_unit, value);
        if (skill_data && skill_data["消耗触发"]) {
            value = skill_data["消耗触发"](fight_data, src_unit);
        }
    }
    return res;
}

/**
 * 消耗魔法
 * @param {*} fight_unit 
 * @param {*} num 
 * @returns 
 */
export function consummer_unit_zhan_yi(fight_data, fight_unit, num, skill_name) {
    if (!consummer_unit_mp(fight_unit, num)) {
        return false;
    }
    if (num > fight_unit["战意"]) {
        return false;
    }
    fight_unit["战意"] -= num;
    if (check_fight_unit_jingmai(fight_unit, "凌波城", "魂聚")) {
        add_fen_nu(fight_unit, 10);
    }
    if (fight_unit["神器"] && fight_unit["神器"]["佩戴"] && fight_unit["神器"]["名称"] === "酣战") {
        add_fen_nu(fight_unit, 10);
        G.FightStatusUtils.add_unit_status(fight_data, fight_unit, fight_unit, "酣战", 69);
    }
    return true;
}


/**
 * 消耗气血
 * @param {*} fight_unit 
 * @param {*} num 
 * @returns 
 */
export function consummer_unit_hp(fight_unit, num) {
    console.debug(`消耗气血气血开始 编号 ${fight_unit["编号"]} 气血 ${fight_unit["气血"]} num ${num}`)
    if (fight_unit["气血"] === 0) {
        return false;
    }
    if (num > fight_unit["气血"]) {
        return false;
    }
    fight_unit["气血"] -= num;
    console.debug(`参消耗气血结束 编号 ${fight_unit["编号"]} 气血 ${fight_unit["气血"]} num ${num}`)
    return true;
}

/**
 * 消耗愤怒
 * @param {*} fight_unit 
 * @param {*} num 
 * @returns 
 */
export function consummer_unit_fen_nu(fight_unit, num) {
    num = Math.floor(num * (fight_unit["特效愤怒"] || 1));
    if (fight_unit["愤怒"] === undefined || num > fight_unit["愤怒"]) {
        return false;
    }
    if (fight_unit["神器"] && fight_unit["神器"]["佩戴"] && fight_unit["神器"]["名称"] === "玉魄") {
        fight_unit["临时治疗"] = fight_unit["神器"]["等级"] * num;
    }
    remove_fen_nu(fight_unit, num);
    return true;
}

/**
 * 消耗魔法
 * @param {*} fight_unit 
 * @param {*} num 
 * @returns 
 */
export function consummer_unit_mp(fight_unit, num) {
    if (fight_unit["魔法"] === 0) {
        return false;
    }
    if (fight_unit["慧根"]) {
        num = Math.floor(fight_unit["慧根"] * num);
    }
    if (fight_unit["飞檐走壁"]) {
        num = Math.floor(fight_unit["飞檐走壁"] * num);
    }

    if (fight_unit["法术状态"]["罗汉珠"]) {
        num = Math.floor(num * (1 - fight_unit["法术状态"]["罗汉珠"]["境界"] * 0.04));
    }

    if (fight_unit["雷浪穿云"]) {
        num = Math.floor(num * 2 + 30);
    }
    if (fight_unit["法术状态"]["魔息术"] && fight_unit["法术状态"]["魔息术"]["魔息"]) {
        num = 1;
    }
    if (num > fight_unit["魔法"]) {
        return false;
    }
    fight_unit["魔法"] -= num;
    return true;
}

/**
 * 增加人参果
 * @param {*} fight_unit 
 */
export function add_ren_shen_guo(fight_unit) {
    if (fight_unit["人参果"]["枚"] < 3) {
        fight_unit["人参果"]["枚"] += 1;
    }
    fight_unit["人参果"]["回合"] = 4;
}


/**
 * 消耗风灵 TODO
 * @param {*} fight_unit 
 * @param {*} num 
 * @returns 
 */
export function consummer_fengling(fight_data, fight_unit, num) {
    if (fight_unit["队伍"] === 0) {
        return 0;
    }
    if (fight_unit["法术状态"]["风灵"] === undefined) {
        return 0
    }
    // 概率
    let gl = check_fight_unit_jingmai(fight_unit, "神木林", "秀木") ? 75 : 50;
    if (fight_unit["法术状态"]["风灵"]["层数"] < num) {
        let sl = fight_unit["法术状态"]["风灵"]["层数"];
        G.FightStatusUtils.canel_unit_status(fight_data, "风灵", fight_unit);
        if (check_fight_unit_passive_skill(fight_unit, "木精") && G.RandomUtils.chance(gl)) {
            G.FightStatusUtils.add_unit_status(fight_data, fight_unit, fight_unit, "木精", 11, sl)

        } else {
            if (fight_unit["萦风"]) {
                fight_unit["萦风"] = sl;
            }
        }
        if (check_fight_unit_jingmai(fight_unit, "神木林", "风魂")) {
            add_hu_dun_for_lt_hp(fight_data, fight_unit, fight_unit["等级"] * 3 * sl);
        }
        return sl;
    }

    fight_unit["法术状态"]["风灵"]["层数"] -= num;

    if (fight_unit["神器"] && fight_unit["神器"]["佩戴"] && fight_unit["神器"]["名称"] === "凭虚御风") {
        G.FightStatusUtils.add_unit_status(fight_data, fight_unit, fight_unit, "凭虚御风", 69);
    }

    if (fight_unit["法术状态"]["风灵"]["层数"] <= 0) {
        G.FightStatusUtils.canel_unit_status(fight_data, "风灵", fight_unit);
    }
    if (check_fight_unit_passive_skill(fight_unit, "木精") && G.RandomUtils.chance(gl)) {
        G.FightStatusUtils.add_unit_status(fight_data, fight_unit, fight_unit, "木精", 11, num);
    } else {
        if (fight_unit["萦风"]) {
            fight_unit["萦风"] = num;
        }
    }
    if (check_fight_unit_jingmai(fight_unit, "神木林", "风魂")) {
        add_hu_dun_for_lt_hp(fight_data, fight_unit, fight_unit["等级"] * 10 * num);
    }
    return num;
}

const run_away_status_list = ["缚妖索", "捆仙绳", "缚龙索"];
/**
 * 计算参战单位有多少个影响逃跑成功率的状态
 * @param {*} fight_unit 
 */
export function get_unit_run_away_status(fight_unit) {
    let status_count = 0;
    if (fight_unit["法术状态"]) {
        for (let index = 0; index < run_away_status_list.length; index++) {
            let run_away_status = run_away_status_list[index];
            if (fight_unit["法术状态"][run_away_status]) {
                status_count++;
            }
        }
    }
    return status_count;
}

/**
 * 取是否被封印 判断是否被封印
 * @param {*} fight_unit 
 * @returns 
 */
export function get_unit_fengyin_status(fight_unit) {
    if (fight_unit["法术状态"]) {
        for (let index = 0; index < G.Skill.feng_yin_status_ap.length; index++) {
            let fengyin_status = run_away_status_list[index];
            if (fight_unit["法术状态"][fengyin_status]) {
                return true;
            }
        }
    }
    return false;
}


/**
 * 不可复活 计算单位是否不可复活
 * @param {*} fight_unit 
 * @returns 
 */
export function is_no_revive(fight_unit) {
    if (fight_unit["气血"] > 0 || fight_unit["逃跑"] || fight_unit["捕捉"]) {
        return true;
    } else if (fight_unit["法术状态"] && fight_unit["法术状态"]["剑意"] && fight_unit["法术状态"]["剑意"]["层数"] >= 23) {
        return false
    }

    for (let index = 0; index < G.Skill.no_revive_status_ap.length; index++) {
        let no_revive_status = G.Skill.no_revive_status_ap[index];
        if (fight_unit["法术状态"][no_revive_status]) {
            return true;
        }
    }
    return false;
}

/**
 * 清空技能冷却
 * @param {*} fight_unit 
 * @param {*} skill_name 
 */
export function clear_unit_skill_cd(fight_unit, skill_name) {
    for (let index = 0; index < fight_unit["主动技能"].length; index++) {
        const skill = fight_unit["主动技能"][index];
        if (skill["名称"] === skill_name) {
            skill["剩余冷却回合"] = undefined;
            break;
        }
    }
}

/**
 * 设置技能冷却
 * @param {*} fight_unit 
 * @param {*} skill_name 
 */
export function set_unit_skill_cd(fight_unit, skill_name, hh) {
    for (let index = 0; index < fight_unit["主动技能"].length; index++) {
        const skill = fight_unit["主动技能"][index];
        if (skill["名称"] === skill_name) {
            skill["剩余冷却回合"] = hh;
            break;
        }
    }
}

/**
 * 减少技能冷却
 * @param {*} fight_unit 
 * @param {*} skill_name 
 */
export function remove_unit_skill_cd(fight_unit, skill_name, hh) {
    for (let index = 0; index < fight_unit["主动技能"].length; index++) {
        const skill = fight_unit["主动技能"][index];
        if (skill["名称"] === skill_name && skill["剩余冷却回合"]) {
            skill["剩余冷却回合"] -= hh;
            if (skill["剩余冷却回合"] <= 0) {
                skill["剩余冷却回合"] = undefined;
                break;
            }
        }
    }
}

// 增加人参果
export function add_rsg(fight_unit) {
    if (fight_unit["人参果"]["枚"] < 3) {
        fight_unit["人参果"]["枚"] += 1;
    }
    fight_unit["人参果"]["回合"] = 4;
}

/**
 * 校验单位是否佩戴神器，并且是指定技能
 * @param {*} fight_unit 
 * @param {*} skill_name 
 */
export function check_unit_shen_qi_skill(fight_unit, skill_name) {
    return fight_unit["神器"] && fight_unit["神器"]["佩戴"] && fight_unit["神器"]["技能"][0]["名称"] === skill_name;
}

/**
 * 减少单位气血上限
 * @param {*} fight_data 
 * @param {*} src_unit 
 * @param {*} target_unit 
 * @param {*} max_hp 
 */
export function remove_unit_hp_max(fight_data, src_unit, target_unit, max_hp) {
    target_unit["气血上限"] -= max_hp;
    if (target_unit["气血上限"] < 0) {
        target_unit["气血上限"] = 0;

        if (G.FightUnitUtils.check_fight_unit_jingmai(src_unit, "普陀山", "秘术")) {
            target_unit["气血"] = 0;
            G.FightStatusUtils.add_unit_status(fight_data, src_unit, target_unit, "秘术", 69);
        }
    }
}